/*express框架
*安装      npm install express  --save   //cnpm install express  --save
*获得post数据的插    件express中间件
*1.npm install body-parser --save
*2. var bodyParser=require("body-parser")
*3.设置中间件
* app.use(bodyParser.urlencoded({extended:false}))
* app.use(bodyParser.json())
*
*  body-parser 中间件 第三方的 获取post提交的数据 (模块)
* cookie-parser可以设置和获取cookie
* 1.npm install cookie-parser --save
* 2.var cookieParser=require('cookie-parser');
* 3.app.use(cookieParser()); 设置中间件
* 4.res.cookie('name',"zhangsan",{maxAge:900000,httpOnly:true}); 设置cookie
* 5. console.log(req.cookies)获取cookies
* cookie 参数 保存在浏览器本地 如果没有 过期的话关闭浏览器在打开cookie 还是存在的
*           maxAge 过期时间
*           httpOnly    如果是true cookie 只能在服务器端设置 客户端不能设置
*           path        cookie 在哪个路径下是有效的
*           signed 加密  让用户看不到cookie的明文信息
*               5.1保存的时候加密
*               5.2cookie-parser里面的signed :true
*           console.log(req.signedCookies);//获取加密那一部分的cookies
*           domain设置域名
* cookie加密 signed
*   1.app.use(cookieParser('sign')); 参数表示加密的随机字符串
*   2.res.cookie('password',m,{maxAge:900000,signed:true,httpOnly:true});  设置
*   3.req.signedCookies 使用 获取加密的cookies
* C:\Windows\System32\drivers\etc\hosts
*
* session
* 1.安装 npm install express-session --save
* 2.引入 var session=require('express-session');
* 3.设置官方文档提供的中间件
*   app.use(session({
        secret: 'keyboard cat',
         resave: false,
         saveUninitialized: true,
         cookie: { secure: true }
      }))
* 4.设置值 req.session.username="zhangsan";
*   获取值req.session.username
* 5.参数
*     secret 字符串作为服务器端生成session的签名 可以随便写
*     name: 返回客户端key的名字,默认是connectsid 也可以自己设置 也可以不设置
*     resave 强制保存session即使没有变化 默认为true 建议设置成false
*     saveUninitialzed 强制将未初始化的session存储 默认为true 建议设置为true
*     cookie
*     r0lling:true 在每次请求时强制设置cookie  续cookie过期时间 默认false
*express-session里常用的方法
*   1.销毁session   第1种方法 req.session.cookie.maxAge=0
*                   第2种方法  req.session.destroy(function (err) {console.log(err);});
*   2.session负载均衡
*       2.1需要安装express-session 和connect-mongo模块
*           npm install connect-mongo --save
*       2.2 引入模块
*             var session=requere('express-session');
*             var MongoStore=require('connect-mongo')(session);
*       2.3使用 设置官方文档 中间件
*     store: new MongoStore({
        url: 'mongodb://127.0.0.1:27017/test-app',
        touchAfter: 24 * 3600 // time period in seconds
    })
*
* */
var express=require('express');//引入
var bodyParser=require("body-parser");//引入获得post的中间件  body-parser
var app=new express();//实例化 构建一个对象

var cookieParser=require('cookie-parser');//引入cookie

var session=require('express-session');//引入session

var MongoStore=require('connect-mongo')(session);//引入connect-mongo 存储session信息到mongoDB

app.set('view engine','ejs');//设置模版引擎的类型

// app.engine('html',ejs.__express) //修改express默认模版ejs扩展名
// app.set('view engine','html');//设置模版引擎的类型

app.use(express.static("publicStatic"));//定义express找静态文件的路径
app.use('/baike',express.static("baikePublicStatic"));
//http://127.0.0.1:3000/baike/baidu.png 到baikePublicStatic' 虚拟路由指定到baikePublicStatic
// 中间件 是指匹配路由之前或者匹配路由 之后所做的一系列的操作,表示匹配任何路由 app.use
//权限判断 判断用户是否登录 ,没登录就强制登录 登录了就继续浏览
// next();继续向下匹配路由
app.use(function (req,res,next) {
    console.log(new Date());

    next();//next函数意思是 继续往下执行
});
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
//设置cookie中间件
app.use(cookieParser());

//设置session的中间件
app.use(session({
    secret: 'keyboard cat',
    // name:'cid',
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge:1000*30*60,//设置超时时间
        // secure: true// secure加密  是指https 这样的访问时 才可以访问cookie
    },
    rolling:true,//续cookie过期时间

    //设置session信息到mongoDM的中间件
    store: new MongoStore({
        url: 'mongodb://127.0.0.1:27017/test-app',//数据库地址
        touchAfter: 24 * 3600 // time period in seconds
    })
}));

app.set("views",__dirname+'/statics');//设置模版的默认位置 把原先放ejs的模版的views  修改成statics

app.get('/',function (req,res) {
    // res.send('hello express ');
    //以下是cookie打开
    // if(req.cookies.citys){
    //     var citys=req.cookies.citys;
    //     res.send('您浏览过的城市是:'+citys);
    // }else{
    //     var citys="空";
    // }
    // console.log(citys);
    //开始写session代码
    //获取session
    if(req.session.username){
        res.send("你好"+req.session.username+"欢迎回来");
    }else{
        res.send("未登录");
    }


});
app.get('/set',function (req,res) {
    var m=777-333;
    // res.cookie('name',"zhangsan",{maxAge:900000,path:'/news',httpOnly:true,signed:true,domain:".aaa.com"});//设置cookie
    res.cookie('password',m,{maxAge:900000,signed:true,httpOnly:true});//设置cookie
    res.cookie("age","20",{maxAge:900000,httpOnly:true});
    res.send('设置cookie成功 ');

});
//浏览过的城市用cookies表示出来
app.get('/lvyou',function (req,res) {
    // console.log(req.query.city);

    if (!req.query.city){//url中没有city
        if(req.cookies.citys){
            var citys=req.cookies.citys;

        }else{
           var citys="空";
        }
        res.send('您浏览过的城市是:'+citys);
    }else{//url中有city
        if (req.cookies.citys){//cookies里有citys
            var city=req.query.city;
            var citys=req.cookies.citys;
            citys=citys+" "+city;
            res.cookie('citys',citys,{maxAge:900000,httpOnly:true});
        }else{//url中有city cookies里没有citys
            var city=req.query.city;
            var citys="";
            citys=citys+" "+city;
            res.cookie('citys',citys,{maxAge:900000,httpOnly:true});
        }

        // res.send(city);
        console.log(req.cookies.citys);
        res.send('您浏览过的城市是:'+city);
        // res.send('您浏览过的城市是:'+citys);
    }




});
app.get('/login',function (req,res) {
    //以下是cookie打开
    // console.log(+req.cookies.password+333);
    // console.log(req.signedCookies);//获取加密那一部分的cookies
    // res.send('登录模块 ');
    // res.render("login")
    //开始写session
    req.session.username="zhangsan";//设置session
    res.send('登录成功');

});
//退出登录
app.get('/loginout',function (req,res) {
    // req.session.cookie.maxAge=0;// sessions销毁 第1种方法 改变cookie的过期时间
    req.session.destroy(function (err) {
        console.log(err);
    });
    res.send('已经退出登录');

});
app.post('/dologin',function (req,res) {
    console.log(req.body);

});
app.get('/register',function (req,res) {
    res.send('注册模块 ');
});

//动态路由传值 http://127.0.0.1:3000/news/2313
app.get('/news/:aid',function (req,res) {

    console.log(req.params); //req.params 获取动态路由的传值
    var aid=req.params.aid;
    res.send('news模块:'+aid);
});

//获取get传值 http://127.0.0.1:3000/product?aid=45
app.get('/product',function (req,res) {
    console.log(req.query);
    res.send('product'+req.query.aid+"--"+req.query.cid);
});

app.get('/index',function (req,res,next) {
console.log("你好");
    next();
});

app.get('/index',function (req,res) {
    // res.send('ejs演示');
    var msg='abc';
    res.render('index',{msg:msg});//渲染模版 render渲染 用express中的res.render不用写模版扩展名ejs
});


//没有匹配到路由 就执行404
app.use(function (req,res) {
    res.status(404).send('这是404 表示路由没有匹配到')

});
app.listen(3000,'127.0.0.1');